package br.com.cfccultura.admin.model.dao.mysql;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;

import org.springframework.dao.DataIntegrityViolationException;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.stereotype.Repository;

import br.com.cfccultura.admin.model.dao.IFornecedorDAO;
import br.com.cfccultura.admin.model.enums.Ativo;
import br.com.cfccultura.admin.model.vo.Fornecedor;
import br.com.cfccultura.admin.model.vo.TipoFornecedor;

@Repository
public class FornecedorDAO extends DAO implements IFornecedorDAO {

	@Override
	public List<Fornecedor> consultar(Fornecedor vo) {

		String sql = "SELECT fornecedor.cd_fornecedor, fornecedor.cd_tipo_fornecedor, tipo.dc_tipo_fornecedor, fornecedor.dc_cpf_cnpj, fornecedor.dc_razao_social, fornecedor.dc_nome_fantasia, fornecedor.id_ativo " +
				"FROM tb_fornecedor fornecedor, tb_tipo_fornecedor tipo where ";
		Object[] params;
		if(vo.getCodigo() != null) {
			sql += "fornecedor.cd_fornecedor = ? ";
			params = new Object[]{vo.getCodigo()};
		} else {
			sql += "fornecedor.dc_nome_fantasia like ? ";
			String desc = "%";
			if(vo.getNomeFantasia() != null && !vo.getNomeFantasia().equals("")) {
				desc = vo.getNomeFantasia() + "%";
			}
			params = new Object[]{desc};
		}
		sql += "and fornecedor.cd_tipo_fornecedor = tipo.cd_tipo_fornecedor and fornecedor.id_ativo = 1 order by fornecedor.dc_nome_fantasia";

		List<Fornecedor> result = query(sql, params, new RowMapper<Fornecedor>() {
			@Override
			public Fornecedor mapRow(ResultSet rs, int arg1) throws SQLException {
				Fornecedor vo = new Fornecedor();
				vo.setCodigo(rs.getInt("fornecedor.cd_fornecedor"));
				vo.setTipo(new TipoFornecedor(rs.getInt("fornecedor.cd_tipo_fornecedor"), rs.getString("tipo.dc_tipo_fornecedor")));
				vo.setCpfCnpj(rs.getString("fornecedor.dc_cpf_cnpj"));
				vo.setRazaoSocial(rs.getString("fornecedor.dc_razao_social"));
				vo.setNomeFantasia(rs.getString("fornecedor.dc_nome_fantasia"));				
				vo.setAtivo(Ativo.setValue(rs.getInt("fornecedor.id_ativo")));
				return vo;
			}
			
		});		
		
		return result;
	}
	
	@Override
	public void incluir(Fornecedor vo) {
		String sql = "INSERT INTO tb_fornecedor(cd_tipo_fornecedor, dc_cpf_cnpj, dc_razao_social, dc_nome_fantasia) values(?,?,?,?)";
		update(sql, new Object[] {vo.getTipo().getCodigo(), vo.getCpfCnpj(), vo.getRazaoSocial(), vo.getNomeFantasia()});
	}
	
	@Override
	public void alterar(Fornecedor vo) {
		String sql = "UPDATE tb_fornecedor set cd_tipo_fornecedor = ?, dc_razao_social = ?, dc_nome_fantasia = ? where cd_fornecedor = ?";
		update(sql, new Object[] {vo.getTipo().getCodigo(), vo.getRazaoSocial(), vo.getNomeFantasia(), vo.getCodigo()});
	}
	
	@Override
	public void excluir(Integer id) {
		try {
			String sql = "DELETE FROM tb_fornecedor where cd_fornecedor = ?";
			update(sql, new Object[] {id});
		} catch(DataIntegrityViolationException e) {
			String sql = "UPDATE tb_fornecedor set id_ativo = 0 where cd_fornecedor = ?";
			update(sql, new Object[] {id});
		}
	}

}
